/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servico;

import br.com.foxinline.enums.DiasSemana;
import br.com.foxinline.modelo.Horario;
import br.com.foxinline.modelo.ItemHorario;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class HorarioServico extends ServicoGenerico<Horario> {

    @EJB
    ItemHorarioServico itemHorarioServico;

    public HorarioServico() {
        super(Horario.class);
    }

    @Override
    public void salvar(Horario entity) {

        if (!existeHorario(entity)) {
            super.salvar(entity);
            for (ItemHorario item : entity.getItemHorario()) {
                item.setHorario(entity);
                itemHorarioServico.salvar(item);
            }
        } else {
        }

    }

    @Override
    public void atualizar(Horario entity) {

        if (!existeHorario(entity)) {
            super.salvar(entity);
            for (ItemHorario item : entity.getItemHorario()) {
                item.setHorario(entity);
                itemHorarioServico.salvar(item);
            }
        }

    }

    @Override
    public void deletar(Horario entity) {

        for (ItemHorario itemHorario : entity.getItemHorario()) {
            itemHorarioServico.deletar(itemHorario);
        }

        entity.setItemHorario(null);

        super.deletar(entity);
    }

    @Override
    public Horario pesquisar(Long entityID) {
        Horario result = (Horario) super.pesquisar(entityID);

        result.setItemHorario(itemHorarioServico.pesquisar(result));

        return result;
    }

    public List<Horario> pesquisar(Horario entity) {

        String sql = "SELECT distinct(h) FROM Horario h ";

        sql += "JOIN h.itemHorario i ";

        sql += " WHERE ";

        if (entity != null) {
            if (entity.getItemHorario() != null && !entity.getItemHorario().isEmpty()) {
                sql += "i.diaSemana in :dias AND ";
            }
        }

        sql += "1=1";

        Query query = getEntityManager().createQuery(sql);

        if (entity != null) {
            if (entity.getItemHorario() != null && !entity.getItemHorario().isEmpty()) {

                List<DiasSemana> dias = new ArrayList<DiasSemana>();

                for (ItemHorario itemHorario : entity.getItemHorario()) {
                    dias.add(itemHorario.getDiaSemana());
                }

                query.setParameter("dias", dias);
            }
        }

        List<Horario> horarios = new ArrayList<Horario>();

        for (Horario h : (List<Horario>) query.getResultList()) {
            h.setItemHorario(itemHorarioServico.pesquisar(h));

            horarios.add(h);
        }

        return horarios;
    }

    public boolean existeHorario(Horario entity) {

        String sql = "SELECT h FROM Horario h JOIN h.itemHorario item ";

        if (entity != null) {
            if (entity.getItemHorario() != null && !entity.getItemHorario().isEmpty()) {
                sql += "WHERE item.diaSemana IN :diaSemana "
                        + "AND item.horarioInicial = :horarioInicial "
                        + "AND item.horarioFinal = :horarioFinal ";
            }
        }

        Query query = getEntityManager().createQuery(sql);

        if (entity != null) {

            if (entity.getItemHorario() != null && !entity.getItemHorario().isEmpty()) {

                List<DiasSemana> dias = new ArrayList<DiasSemana>();

                for (ItemHorario itemHorario : entity.getItemHorario()) {
                    dias.add(itemHorario.getDiaSemana());
                }

                query.setParameter("diaSemana", dias);

                query.setParameter("horarioInicial", entity.getItemHorario().get(0).getHorarioInicial());
                query.setParameter("horarioFinal", entity.getItemHorario().get(0).getHorarioFinal());
            }
        }

        return !((List<Horario>) query.getResultList()).isEmpty();
    }

    public List<Horario> pesquisarDistintos(Horario horario) {
        String sql = "SELECT DISTINCT(h) from Horario h JOIN h.itemHorario i WHERE ";

        if (horario != null && horario.getId() != null) {
            if (horario.getItemHorario() != null && !horario.getItemHorario().isEmpty()) {
                sql += "i.diaSemana in :diasSemana AND";
            }
        }

        sql += "1=1 order by i.diaSemana";
        
        System.err.println(sql);

        Query query = getEntityManager().createQuery(sql);
        
        if (horario != null && horario.getId() != null) {
            if (horario.getItemHorario() != null && !horario.getItemHorario().isEmpty()) {
                List<DiasSemana> horarios = new ArrayList<DiasSemana>();
                
                for (ItemHorario itemHorario : horario.getItemHorario()) {
                    horarios.add(itemHorario.getDiaSemana());
                }
                
                query.setParameter("diasSemana", horarios);
            }
        }

        return query.getResultList();
    }
}
